import { MessageType } from "./messageType";
import { Client } from "./Client";

/**
 * 管理消息发送
 */
export abstract class Message {
    T: NodeJS.Timer;
    constructor(protected client: Client) {
        this.T = setInterval(() => this.interval(), 5E3)
    }
    /** 暂存的消息 */
    protected messages: MessageType[] = [];
    /** 将一个普通的文本消息添加到 messages 里，在下次发送时一起发送 */
    add(message: string, lineFeed: boolean = true) {
        this.messages.push(MessageType.toPlain(message));
        if (lineFeed) {
            this.messages.push(MessageType.toPlain("\n\n")); // 添加空行
        }
    }
    /** 直接通过 MessageType 添加，而不是普通的文本 */
    public addMessageType(messageType: MessageType | MessageType[]) {
        if (messageType instanceof Array) {
            this.messages = this.messages.concat(messageType);
        } else {
            this.messages.push(messageType);
        }
    }
    /** 最终发消息的实现过程 */
    abstract send(): void;

    /** 关闭 */
    close() {
        // 在关闭之前执行一次。
        this.interval();
        // 清除定时器，不再被执行
        clearInterval(this.T);
    }
    /** 定时器任务，循环执行 */
    interval() {
        if (this.messages.length > 0) {
            this.checkLastMessage();
            this.send()
            this.messages = []; // 清空暂存的消息
        }
    }

    /** 检测最后一个消息是不是空行，如果是则删除它 */
    private checkLastMessage() {
        const lastMessage = this.messages[this.messages.length - 1]
        if (lastMessage.type == "Plain")
            if (lastMessage.text == "\n\n") {
                this.messages.pop();
            }
    }
}

/**
 * 目前好友消息也是用过群消息发送，只不过前缀是 @ QQ 的格式
 */
export class FriendMessage extends Message {
    constructor(client: Client, private QQ: string, private userName: string, private groupId: string) {
        super(client);
    }
    send(): void {
        // 在最前面 @它一下
        this.messages.unshift(MessageType.toAt(this.QQ), MessageType.toPlain("\n"));
        // console.log("发送好友消息", this.QQ, "[", this.messages.join("\n"), ']');
        this.client.sendGroupMessage(this.groupId, this.messages)
    }
}

export class GroupMessage extends Message {
    constructor(client: Client, private groupId: string) {
        super(client);
    }
    send(): void {
        // console.log("发送群消息", this.groupId, "[", this.messages.join("\n"), "]");
        this.client.sendGroupMessage(this.groupId, this.messages)
    }
}

